package com.study.locks.jdk;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Lock和synchronized的选择
 *
 *  1. Lock是接口，而synchronized是Java中的关键字;
 *  2. synchronized不会导致死锁现象发生；而Lock可能造成死锁现象；
 *  3. Lock可以让等待锁的线程响应中断，而synchronized却不行；
 *  4. 通过Lock可以知道有没有成功获取锁，而synchronized却无法办到。
 *  5. Lock可以提高多个线程读操作的效率。
 *  6. 在性能上来说，如果竞争资源不激烈，两者性能是差不多的，而当竞争资源非常激烈时（即有大量线程同时竞争），此时Lock的性能要远远优于synchronized。所以说，在具体使用时要根据具体情况选择。
 *
 * @author: chenhs
 * @date: Created in 7:07 2019/12/15
 **/
public class SellTicket_Lock implements Runnable {

    //100张票
    private int tickets = 100;

    //可重入锁
    Lock lock = new ReentrantLock();

    @Override
    public void run() {
        while (tickets > 0) {

            //开启锁
            lock.lock();
            //lock.tryLock();
            try {
                if (tickets > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //窗口号
                    System.out.println(Thread.currentThread().getName() + "正在出票第 " + (tickets--) + " 张票");
                }
            } finally {
                lock.unlock();
            }
        }
    }
}
